他人のpublic projectの記事と関連ページをまとめてSmart Contextでexportして、Gemini 2.5 proで対話する
書かれている事はまっとうだ
validationの実装が色々な所に散らばっているのはよくない
validatorのLayerとTierを設計する
つまり多重実装している。これがokなのか気になったshokai.icon
いや実装が多重なわけではないのか。実装は1つで利用箇所が複数なだけ?
ざっと読んだせいか、validatorの実装の重複を避ける理由がshokai.iconにははっきりとはわからなかった
過去の記事でそういう話を説明していて、自明だから触れてないのかも?
2箇所のvalidatorが同じfieldを別々の方法でバリデーションしてて、何かたまたまうまく動いているような可能性もあってそういうのは危険だよ、みたいな話は、書かれてた気がする
最終的に漏れ・抜けなくDB上のデータが常にvalidだったり、CPUで処理されるデータがvalidであればいいのだから、むしろ共通実装をいろんな所で使いまわしたほうが良いのではないか? 質問してみた
共有用リンク
こっちは自分用
https://gyazo.com/d406f2b2f5ec42bb529fb75a8edcda0a
https://gyazo.com/aceacea002bff66a079fd0ebe5ff489c
https://gyazo.com/22af7b45de322a9e548bf0f71d1b498d
ここから先はGeminiアカウントだと24時間待ってねになってしまったので、会社のGoogleアカウントで試した
むしろ共通実装をclient serverで使いまわしたほうが安全だったりしませんか?shokai.icon
その方が漏れ・抜けが少なくなる
はい、おっしゃる通り、クライアントとサーバーで共通のバリデーションロジック(実装や定義)を共有し、使い回すことは、多くのメリットがあり、結果として「漏れ・抜け」が少なくなり安全性向上に寄与する面が多いと考えられます。Gemini.icon
「バリデーション解体新書」の文脈と照らし合わせて、この点についてご説明します。
共通実装のメリットと「バリデーション解体新書」の主張
1. ルールの整合性向上 → 「漏れ・抜け」の削減:
クライアントとサーバーで同じバリデーションロジックを使用すれば、バリデーションルールそのものの不整合(例:クライアントでは許可されるがサーバーではじかれる、またはその逆)を防ぐことができます。これにより、ユーザーはクライアント側でサーバーと同じ基準のフィードバックを受け取れ、開発者はルールの二重管理や同期のズレから解放されます。これはまさに「漏れ・抜けが少なくなる」という効果に直結します。
文書では、特に異なるレイヤーやコンポーネント間でバリデーションロジックが個別に実装・管理されることによる不整合や冗長性を問題視しています。共通実装は、この問題に対する有効な解決策の一つと言えます。
2. 開発効率の向上:
バリデーションロジックを一度定義・実装すれば、それをクライアントとサーバーの両方で再利用できるため、開発コストを削減できます。
「バリデーション解体新書」が強調するポイントとの関連
共通実装を採用する場合でも、「バリデーション解体新書」が強調する以下のポイントは依然として重要です。
1. サーバーサイドでのバリデーション実行の必須性:
文書では「Tier間はネットワーク接続されており、データ改竄の可能性を考慮することが求められる。したがってクライアントサイドでバリデーションしていても、サーバサイドで同様のバリデーションが必要とされる」と述べています cite: 3。これは、クライアント側のバリデーションはあくまでUX向上やサーバー負荷軽減のためのものであり、セキュリティやデータの最終的な正当性担保はサーバー側の責任である、という原則を示しています。共通ロジックを使っていても、サーバー側でそのロジックを実行することは不可欠です。
2. サーバー内部での「Parse don't Validate」の適用:
共通のバリデーションロジックをサーバーのController層(入力の境界)で使用してリクエストを検証し、それを「Always-Valid Domain Model」(常に正当な状態が保証されたドメインオブジェクト)に変換(パース)した場合、その後のService層やModel層では、そのオブジェクトが持つ値の入力形式に関する再検証は不要になる、というのが文書の提案する考え方です。
もちろん、Service層やModel層では、入力形式のチェックとは異なる種類のバリデーション(例:複数のデータ間の整合性チェック、ビジネスルール、状態遷移の妥当性、DBの制約に関連するチェックなど)が必要になる場合はあります。
まとめ
クライアントとサーバーでバリデーションの共通実装を使い回すことは、
ルールの統一性: クライアントとサーバー間でのバリデーションルールの「漏れ・抜け」や不一致を減らす。
開発・保守の効率化: ロジックの一元管理による。
という点で非常に有効であり、文書が指摘する「複数の独立したバリデーション実装による問題」を回避する良いアプローチです。
ただし、
サーバーサイドでのバリデーション実行は絶対必要であること。
サーバー内部においては、入力境界で検証・パースされた信頼できるオブジェクトを後続の処理で信頼し、同じ入力形式の検証を不必要に繰り返さない設計(Parse don't Validate)を検討する価値があること。
これらの点は「バリデーション解体新書」の重要なメッセージとして残ります。共通実装は、このサーバーサイドでの必須のバリデーションを、より正確かつ効率的に行うための強力な手段となり得ます。